We must load shared_info into %esi at every external entry point into
entry.S (i.e., every label marked ENTRY()). I was missing at least
resume_userspace which is essential for vm86.
call schedule_tail
GET_THREAD_INFO(%ebp)
popl %eax
+ movl HYPERVISOR_shared_info, %esi
jmp syscall_exit
/*
testl $(VM_MASK | 2), %eax
jz resume_kernel # returning to kernel or vm86-space
ENTRY(resume_userspace)
+ movl HYPERVISOR_shared_info, %esi
XEN_BLOCK_EVENTS(%esi) # make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
#ifdef CONFIG_PREEMPT
ENTRY(resume_kernel)
+ movl HYPERVISOR_shared_info, %esi
cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
jnz restore_all
need_resched: